package br.com.cogerh.sidec.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.cogerh.sidec.model.Diretoria;
import br.com.cogerh.sidec.model.Gerencia;
import br.com.cogerh.sidec.util.HibernateUtil;

public class GerenciaImpl implements GerenciaDAO {

	@Override
	public void salvar(Gerencia gerencia) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = sessao.beginTransaction();
		try{
			sessao.save(gerencia);
			sessao.flush();
			sessao.close();
			tx.commit();
		}catch(HibernateException e){
			tx.rollback();
		}
	
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Gerencia> listar() {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = sessao.beginTransaction();
		List<Gerencia> lista = new ArrayList<Gerencia>();
		try{
			Criteria criteria = sessao.createCriteria(Gerencia.class);
			criteria.addOrder(Order.asc("nome"));
			criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
			lista = criteria.list();
			sessao.close();
		}catch(HibernateException e){
			tx.rollback();
		}
	
		return lista;
	}

	@Override
	public void editar(Gerencia gerencia) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = sessao.beginTransaction();

		try{
			
			sessao.merge(gerencia);
			sessao.flush();
			sessao.close();
			tx.commit();
		}catch(HibernateException e ){
			tx.rollback();
		}

	}

	@Override
	public void excluir(Gerencia gerencia) {
		
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = sessao.beginTransaction();
		try{
			sessao.delete(gerencia);
			sessao.flush();
			sessao.close();
			tx.commit();
			
		}catch(HibernateException e){
			tx.rollback();
		}
	

	}

	@Override
	public void editarAllNomes(List<Gerencia> gerencia) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = sessao.beginTransaction();
		try{
			for (Gerencia gerencia_for : gerencia) {
				sessao.merge(gerencia_for);

			}
			sessao.flush();
			sessao.close();
			tx.commit();
		}catch(HibernateException e){
			tx.rollback();
		}
		

	}

	@Override
	public void fecharSessao() {

		HibernateUtil.closeSession();

	}

	@Override
	public List<Gerencia> listarByPessoa(Integer id) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = sessao.beginTransaction();
		List<Gerencia> lista = new ArrayList<Gerencia>();
		try{
			Criteria criteria = sessao.createCriteria(Gerencia.class);
			criteria.add(Restrictions.eq("gerente", id));

			criteria.addOrder(Order.asc("nome"));
			lista = criteria.list();
			sessao.close();
		}catch(HibernateException e){
			tx.rollback();
		}
		return lista;

	}

}
